Docker

您所在的位置:网站首页 visual studio code干什么的 Docker

Docker

2023-04-12 16:05| 来源: 网络整理| 查看: 265

目录

1.了解Docker 

1.1.为什么要用docker?

1.2.可以用docker做什么?

1.3.docker 框架

2.Docker 的基本使用

3.实例 :VS code远程连接服务器上的docker环境

3-1:环境框架可视化及ssh连接,搭建pytorch深度学习环境

3-2:搭建一个新的容器pytorch深度学习环境Create New Env - GPU 版本)

3-3:创建一个TensorFlow深度学习环境Create New Env:Tensorflow)

 安装OpenCV

 安装相关依赖,再安装 dlib

 Docker container set Caffe(正在进行时)

3-4:创建第二个版本的TensorFlow(Create Env:Tensorflow)

总结(Summary)

问题与解决(PS)

[PS1]

[PS2]

[PS3]ImportError: libGL.so.1: cannot open shared object file: No such file or directory

[PS4]docker容器中执行vim命令,报错:bash: vim: command not found

[PS5]

[PS6]

[PS7]

[PS8]

[PS9] 

[PS10]VS code 打不开服务器的docker 容器

 参考文献

1.了解Docker  1.1.为什么要用docker?

容器没有二进制映像,这使得 docker 与其他虚拟工具相比占用的空间要少得多。

1.2.可以用docker做什么? 模拟系统:Ubuntu等 配置深度学习环境:Pytorch/Tensorflow等 1.3.docker 框架

Docker[1] 使用客户端-服务器架构。Docker 客户端与 Docker 守护进程,它负责构建、运行和 分发Docker 容器。Docker 客户端和守护程序可以在同一系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护 进程。Docker 客户端和守护程序使用 REST API 通过 UNIX 进行通信 套接字或网络接口。另一个 Docker 客户端是 Docker Compose, 这是一组容器组成的应用程序。

Docker 守护程序(Docker daemon): 监听 Docker API 请求并管理 Docker 对象,例如映像、容器、网络和卷。守护进程也可以 与其他守护程序通信以管理 Docker 服务。

Docker 客户端 (Client):是许多 Docker 用户交互的主要方式 与 Docker 一起。当使用命令时,客户端会发送这些命令 ,执行这些命令。该命令使用 Docker API。Docker 客户端可以与多个守护程序通信。

Docker注册表(Docker registries):Docker 注册表存储 Docker 映像。Docker Hub 是公共的 任何人都可以使用的注册表,并且 Docker 配置为在 默认情况下为 Docker Hub。您甚至可以运行自己的私有注册表。使用 or 命令时,所需的图像是 从配置的注册表中提取。使用该命令时, 映像将推送到配置的注册表。

镜像(Images):镜像是只读模板,其中包含有关创建 Docker 的说明 容器。通常,一个图像基于另一个图像,还有一些额外的 定制。例如,您可以构建一个基于该映像的映像,但会安装 Apache Web 服务器和您的应用程序,以及 使应用程序运行所需的配置详细信息。

容器(Containers):容器是映像的可运行实例。您可以创建、启动、停止、 使用 Docker API 或 CLI 移动或删除容器。可以连接一个 容器到一个或多个网络,将存储附加到其中,甚至创建新的 基于其当前状态的图像。

默认情况下,容器与其他容器的隔离相对较好,并且 它的主机。可以控制容器的网络、存储、 或其他底层子系统来自其他容器或主机 机器。容器由其映像以及任何配置选项定义 在创建或启动它时提供它。删除容器后,对未存储在持久存储中的状态将消失。

如图,docker的原理是通过docker hub拉取镜像,

通过镜像(image)建立容器:

 整体如图,容器通过操作

 三者之间的关系如下:

2.Docker 的基本使用

[以下内容包括:Ubuntu user path    ]

启动docker

service docker start

 (chongqidiannao hou yijiu xuyao qidong docker)

  docker

docker info

 images

docker images

docker pull : 

docker pull pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel

docker run :创建一个新的容器并运行一个命令Build and run

yufa: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-P: 随机端口映射,容器内部端口随机映射到主机的端口

-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

--name="nginx-lb": 为容器指定一个名称;

--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-h "mars": 指定容器的hostname;

-e username="ritchie": 设置环境变量;

--env-file=[]: 从指定文件读入环境变量;

--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

-m :设置容器使用内存最大值;

--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

--link=[]: 添加链接到另一个容器;

--expose=[]: 开放一个端口或一组端口;

--volume , -v: 绑定一个卷

实例

docker run -it -e /home/elena:/home/elena --gpus all --ipc host --net host --name torch_na pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel /bin/bash

如果出错,可查看[PS]

也就是说以交互模式运行容器,为容器重新分配一个伪输入终端,设置环境变量为 /home/elena:/home/elena,使用 GPU版本,指定容器的网络连接类型为 host。

进入docker 容器

docker exec -it pytorch /bin/bash

这里/bin/bash表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器就会退出。这个就表示启动容器后启动bash。

再次返回到我们的容器。为此,我们需要知道“容器 ID/名称”:

docker ps

docker ps 是查看现在运行的docker 容器

docker ps -a

 docker ps -a 是查看docker 现有的所有容器

让我们做附加:

docker attach 容器名称/容器id 先按Ctrl+P然后再按Ctrl+Q:退出容器,且容器在运行

Ctrl+D:退出容器,且容器不在运行(停止容器)

  启动容器 docker start 容器名称/容器id

 进入容器 docker exec -it 容器名称/容器id /bin/bash

 默认根用户身份登录

检查当前正在运行的进程(容器内查看) top

 

如有4个进程,它们是与主机进程隔离的进程。

 按Ctrl+P然后再按Ctrl+Q,

检查容器内正在运行哪些进程(容器外查看) docker top 容器名称/容器id

可以使用“docker top ”检查容器内正在运行哪些进程:

停止在后台运行的容器 docker stop 容器名称/容器id

docker ps 就可以看到容器没有在运行了.

删除容器

1)首先需要停止所有的容器

docker stop 容器id/名称

2)删除所有的容器(只删除单个时把后面的变量改为container id即可)

docker rm 容器id/名称

删除镜像

1)查看host中的镜像

docker images

2)删除指定id的镜像

docker rmi 镜像id/名称

3)删除全部的images

docker rmi 

3.实例 :VS code远程连接服务器上的docker环境 3-1:环境框架可视化及ssh连接,搭建pytorch深度学习环境

(默认所有镜像获取于docker hub,国内拉取可能会比较慢,建议大家更改国内镜像)

进入docker环境,使用如下命令修改root用户密码:passwd

注意,这里的密码是后续在vscode中远程登录时需要输入的密码

创建环境

(要确认是下载到linux服务器里,还是容器里!!)

linux服务器

安装openssh-server 

如果是root 

apt-get update apt-get install openssh-server

如果是用户(本文中都是用户操作)

sudo apt-get update

sudo apt-get install openssh-server

 

然后设置两遍相同的密码,之后登陆的时候要用到! 4. 修改配置文件

vim /etc/ssh/sshd_config

用户操作

sudo vim /etc/ssh/sshd_config

 注释掉 PermitRootLogin prohibit-password 这一行 添加这一行 PermitRootLogin yes 5. 重启ssh服务

j :向下

i: 添加文本,输入

x: 删除

先按快捷键ESC,然后输入: wq 保存文件并退出

 

service ssh restart # 或使用 # /etc/init.d/ssh restart

进入目录查看是否有sshd文件,如果没有,则使用如下命令创建 mkdir -p /var/run/sshd

woyou 

启动openssh-server

 /usr/sbin/sshd -D &

安装netstat apt-get install net-tools (如果已经安装可忽略)

查看sshd是否监听22端口 netstat -apn | grep ssh

 

在window上vscode中下载Remote-SSH插件

STEP 1 :拉取镜像(把pytorch的环境下载到本地)

 然后创建和运行容器(than build and run container)

docker run -it -e /home/elena/workspace:/home/elena/workspace --gpus all --ipc host --net host --name elena_torch pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel /bin/bash

验证是否可用

退出 python

exit()

 - exit是退出Python指令

复制ubuntu的文件夹到 容器内

 按Ctrl+P然后再按Ctrl+Q,回到ubuntu用户地址下。

ls

- ls指令查询当前位置所有文件夹

复制Ubuntu 本地文件到容器内:

docker cp face_asian torch_na:/workspace

 - torch_na是docker容器名称,后面跟得是容器内保存地址,可以换自己想保存的路径

输入指令后就复制好了,打开容器后,到指定路径就会有文件存在

在VS code中也可以查看 

 

# 开启 docker 自启动 systemctl enable docker.service # 关闭 docker 自启动 systemctl disable docker.service 3-2:搭建一个新的容器pytorch深度学习环境Create New Env - GPU 版本)

获取镜像

打开 Explore Docker's Container Image Repository | Docker Hub

 

pytorch中有很多版本,点击标签(tags),选择一个合适的

拉取pytorch-gpu版本镜像

创建并运行容器

docker run -it -e /home/elena/workspace:/home/elena/workspace --gpus all --ipc host --net host --name torchv2 pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime /bin/bash

复制项目到容器内

docker cp face-att torchv2:/workspace

 

新建test的python文件

touch test.py

 test.py

print("hi") import torch print("torch v:"torch.__version__) print("cuda used:"torch.cuda.is_available()) print(torch.version.cuda) print(torch.backends.cudnn.version()) import platform print(platform.python_version()) import torchvision print(torchvision.__version__)

配置OpenCV(下载opencv-python版本会出错,这个版本不会)

pip install opencv-python-headless

 

设置Tensorboard(Setting Tensorboard)

)

 docker pytorch容器 安装 tensorboard

pip install tensorboard

 if wrong,see [PS8]

docker pytorch容器 安装 matplotlib

pip install matplotlib

 3-3:创建一个TensorFlow深度学习环境Create New Env:Tensorflow)

 

打开MobaXterm( open  MobaXterm),拉取TensorFlow-gpu版本镜像

docker pull tensorflow/tensorflow:devel-gpu

 与上面的pytorch同理,创建TensorFlow深度学习容器并运行

docker run -it -e /home/elena/workspace:/home/elena/workspace --gpus all --ipc host --net host --name tf tensorflow/tensorflow:devel-gpu /bin/bash

 然后直接进入容器

打开win10系统的VS code( Open VS code),在Ubuntu用户下复制项目文件到TensorFlow深度学习容器内,

复制命令如下: 

docker cp face-att tf:/workspace

 - face-att是保存在我Ubuntu用户下的我的项目文件名

- tf:/workspace是容器名称后面跟的项目保存路径

在MobaXterm软件上进入docker容器:

安装deepface第三方库 Set Deepface

pip install deepface

 安装如图

 中间省略

(可选择)升级一下pip版本

/usr/bin/python3 -m pip install --upgrade pip

 

建立一个python文件 (build a file) ,叫做 deepface.py

touh deepfacetest.py

 因为容器内没有vim命令,所以下载然后更新

apt-get install vim apt-get update

( 如果这里出错,查看P4)

建立并编辑一个python文件 

vim deepfacetest.py

 deepfacetest.py

from deepface import DeepFace obj = DeepFace.analyze(img_path = "/workspace/data/face_asian/faces_JinChungChen/00000A02.jpg".jpg", actions = ['age', 'gender', 'race', 'emotion'] ) #/workspace/data/face_asian/faces_JinChungChen/00000A02.jpg print(obj)

 - 此处路径需要改为自己文件的图片路径

编辑完事后,按快捷键 Esc ,输入 :wq 退出并保存文件。

如果出错查看P5( if wrong see P5)

运行刚编辑的python文件(Run deepfacetest.py)

也可以上传自己的文件从Ubuntu服务器到容器内

与配置pytorch深度学习环境同理,复制文件到容器内:

docker cp face_att_v1 tf:/workspace

 安装OpenCV

在OpenCV时,安装得是opencv-python-headless,而不是opencv-python,我一开始安装的就是opencv-python,无法运行(because of cv and dlib,so install env) 。

pip3 install opencv-python-headless

 (远程服务器中docker 容器,配置dlib)

 安装相关依赖,再安装 dlib

依次安装文件

cmake libgtk-3-dev libboost-all-dev dilb apt-get install build-essential cmake

apt-get install libgtk-3-dev

apt-get install libboost-all-dev

 

pip3 install dlib

pip3 list 

 Docker container set Caffe(正在进行时)

 

3-4:创建第二个版本的TensorFlow(Create Env:Tensorflow)

简单概括

#拉取TensorFlow-GPU版本镜像 docker pull tensorflow/tensorflow:1.11.0-devel-gpu-py3 #创建并运行docker容器 docker run --runtime=nvidia -it --name tf tensorflow/tensorflow:1.11.0-devel-gpu-py3 /bin/bash #python验证 python -c "import tensorflow as tf;a=tf.constant(1);b=tf.constant(2);c=tf.add(a,b);sess=tf.Session();result=sess.run(c);print('The result is',result)"

3-5:使用NVIDIA提供的镜像创建环境

下载网址

PyTorch | NVIDIA NGC

 

点击需要的版本,点击下载路径

 

docker run -it -e /mnt/sda1/elena_food:/workspace --gpus all --ipc host --net host --name torch-yolo nvcr.io/nvidia/pytorch:22.12-py3 /bin/bash

 出错查看【PS11】

4.将自己的深度学习环境打包成docker镜像

有时候,我们自己开发的软件需要被其他人所应用。为了减少代码环境配置的时间成本,我们可以将当前运行的容器进行打包,并输出镜像文件,传给使用者即可。

Docker commit 命令

docker commit [CONTANINER ID] [IMAGE NAME:TAG]

 docker commit :从容器创建一个新的镜像。 

# docker commit的其他参数

# -a :镜像作者名字;

# -c :使用dockerfile指令来创建镜像;

# -m :提交说明文字;

# -p :暂停容器服务。

实例

将容器3e7433c86ec7 保存为新的镜像,并添加提交信息和说明信息。

docker commit -a="elena" -m="torch_na" 3e7433c86ec7 torch_na:torch1.12-cuda11.3-cudnn8-py3

-  3e7433c86ec7 是想要打包的容器id

-  torch_na 是想要打包的容器名称

 打包镜像

docker save -o torch_nlp.tar torch_nlp # 当前路径下会生成一个torch_nlp.tar

将tar包生成镜像

docker load < torch_na.tar # 生成的镜像跟之前打包的镜像名称一样  

总结(Summary)

Container and Ubuntu GPU are irrelevant 

Docker是一种相对使用较简单的容器,我们可以通过以下几种方式获取信息:

1,通过docker run执行命令,或许返回信息

2,通过docker logs去获取日志,做有针对性的筛选

3,通过systemctl status docker查看docker服务状态

4,通过journalctl -u docker.service查看日志

5.如文章所示,docker不仅可以模拟系统,还可以搭建不同版本的环境,在我们日常工作中,省去了很多不必要的麻烦。

问题与解决(PS) [PS1]

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"process_linux.go:432: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: requirement error: unsatisfied condition: cuda>=11.6, please update your driver to a newer version, or use an earlier cuda container\\\\n\\\"\"": unknown.ERRO[0000] error waiting for container: context canceled

[PS2]

docker重启错误-重启命令一直卡住

systemctl重新启动docker卡住

未知原因:可能是启动的容器数量过多,或者磁盘IO问题

解决方式:

systemctl启动docker-cleanup.service

systemctl启动docker

[PS3]ImportError: libGL.so.1: cannot open shared object file: No such file or directory

导入错误:libgl.so.1:无法打开共享对象文件:没有这样的文件或目录

 如果您的应用程序依赖于cv2或opencv-python如果您尝试使用诸如 python:3.9-slim、python:buster 等图像构建 docker 容器,并且如果您导入 cv2,您将收到以下错误。

(pip uninstall opencv-python)

安装opencv-python-headless

(pip install opencv-python-headless) 代替opencv-python,您可以安装opencv-python-headless包含没有外部依赖项的预编译二进制轮(除了numpy),并且适用于 Docker 等无头环境。

与此相比,python3-opencv这是一个更轻量级的包,并将 docker 映像大小减少了 700MB

[PS4]docker容器中执行vim命令,报错:bash: vim: command not found

原因分析 :因为vim没有安装。

apt-get install vim

 

 这时,需要先执行命令:apt-get update,等更新完后在执行命令:vim命令进行安装后,就可以正常使用了!

apt-get update的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包,yiban qingkuangxia anzhaunghou douxuyao yong zhetiao mingling gengxinyixia 。

[PS5]

解决

pip3 install --update numpy

 [PS6]

 [PS7]

pip3 list

[PS8]

 TypeError: Descriptors cannot not be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0. If you cannot immediately regenerate your protos, some other possible workarounds are:  1. Downgrade the protobuf package to 3.20.x or lower.  2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).TypeError: 描述符不能被直接创建。 如果这个调用来自_pb2.py文件,你的生成的代码已经过时了,必须用protoc >= 3.19.0重新生成。 如果你不能立即重新生成你的protos,其他一些可能的解决方法是。  1. 将protobuf包降级到3.20.x或更低。  2. 设置PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python(但这将使用纯Python解析,速度会慢很多)。解决方案:

卸载重装!!!

[PS9] 

docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy' nvidia-container-cli: initialization error: nvml error: driver not loaded: unknown.

ERRO[0000] error waiting for container: context canceled

docker:守护进程的错误响应:创建shim任务失败。OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: 自动检测模式为'legacy'。 nvidia-container-cli:初始化错误:nvml错误:驱动程序未加载:未知。 ERRO[0000]等待容器的错误:上下文取消了

原因分析:没安装nvidia/cuda

sudo apt install nvidia-cuda-toolkit

[PS10]VS code 打不开服务器的docker 容器

 [PS11]docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]. ERRO[0000] error waiting for container: context canceled

docker: 守护进程的错误响应:无法选择具有能力的设备驱动程序""。[[gpu]]。 ERRO[0000]等待容器的错误:上下文取消了

错误分析:服务器nvidia驱动原因

 参考文献

【1】Docker overview | Docker Documentation



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3